home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
F1 Licenseware
/
F1 Licenseware - Volume 1.iso
/
disks
/
079c.dms
/
079c.adf
/
how2writeagame.lha
/
how2write_a_game
/
pacman.asc
< prev
Wrap
Text File
|
1992-03-06
|
39KB
|
1,398 lines
' *************************************************************
'
' ======================================
'
' PACMAN SAUCE - Makes A Change From HP!
'
' ======================================
'
' /\/\/\/\/\/\/\/\/\
' By: Paul Nordovics
' \/\/\/\/\/\/\/\/\/
'
' Notes:
' ======
'
' WARNING: THIS PROGRAM DISABLES KEYBOARD CHECKS AND SO YOU
' WON'T BE ABLE TO RETURN TO THE EDITOR BY PRESSING CTRL AND C.
' IF YOU DO WANT TO COME BACK HERE READ THE COMMENTS AT LINES
' 24-30 AND 93-100
'
' *************************************************************
'
' *************************************************************
' Used To Increase Speed Of Program By Up To 10%
' If You Don't Have The Compiler Extension Loaded You Will Get
' An Error Here. Don't Worry, The Game Will Still Work, But
' You Will Have To Delete This Line Or Put A ' In Front Of The
' Command e.g. 'Comp Test Off
' Also BE WARNED That If You Leave This Command In, You Can't
' Break Out Of The Program Using Ctrl And C!
' *************************************************************
Comp Test Off
'
' ********************
' Remove Mouse Pointer
' ********************
Hide
'
Screen Close 0
'
' *************************************************************
' This Was Used So I Could Easily Re-load Any Graphics That Had
' Been Altered Back Into Bank 1
' *************************************************************
_LOAD=0
If _LOAD=1
K$="me_disk:gfx/"
Load K$+"pill.abk"
Load K$+"wall.abk",1
Load K$+"fruit.abk",1
Load K$+"pacman.abk",1
Load K$+"score.abk",1
Load K$+"message.abk",1
Load K$+"ghosts.abk",1
End If
'
' -------------------------------------------------------------
'
' *************************************************************
' INITIALIZATION
' *************************************************************
'
' *************************************************************
' Maze Information:
' Constants Are Used So If Any Values Are Changed, It Is A Lot
' Easier To Alter The Value Here Than Go Through The Entire
' Program Changing Values
' *************************************************************
_DOT_START=1
_DOT_END=6
PILL_START=7
PILL_END=10
WALL_START=11
'
NUMBER_OF_MAZES=20
'
' *************************************************************
' Load In The Map Data From Disk. It Is Done This Way, Rather
' Than Being Permanently Stored In A Bank Because The Mapper
' Can Also Load In The Same Data From Disk To Enable Further
' Alterations To Be Made
' *************************************************************
Load "me_disk:map_data.abk",10
'
' *************************************************************
' Get The Starting Address Of The Part Of Memory Where The
' Current Maze Map Data Will Be Stored. This Makes It Easier
' If Changes Are Made As We Only Have To Change The Value Here
' *************************************************************
MAZE_ADDR=Start(10)+(NUMBER_OF_MAZES*260)
'
' *************************************************************
' Wait For Disk Activity To Finish And Then Turn Off Interrupts
' And Multi-tasking To Speed Things Up A Little. I Got This
' From A Recent AMOSZINE Article Which Goes To Show That Even
' The Experts (Ha! Ha!) Can Still Learn A Thing Or Two
' BE WARNED That This Command Stops You From Breaking Out Of
' The Program By Using Ctrl And C So Put A ' In Front Of The
' Command If You Want To Come Back To The Editor
' e.g. '_FORBID=Execall(-132)
' *************************************************************
Wait 250
_FORBID=Execall(-132)
'
' *************************************************************
' Set Up Pacman Animation Table
' *************************************************************
Dim PACMAN_ANIM(56)
Restore PACMAN_ANIM_DATA
For K=0 To 55
Read PACMAN_ANIM(K)
Next K
'
' *************************************************************
' These Values Correspond To Offsets In The Pacman Animation
' Table Which Get To The Correct Set Of Frames. Offsets Are
' Used So If Extra Frames Are Added We Only Need To Change The
' Values Here
' *************************************************************
PACMAN_UP_ANIM=0
PACMAN_RIGHT_ANIM=11
PACMAN_DOWN_ANIM=22
PACMAN_LEFT_ANIM=33
PACMAN_DYING_ANIM=44
'
' *************************************************************
' Initialize Ghosts
' GHOST_NUMBER Can Be Changed To Values 0,1 Or 2 And Represents
' The Number Of Ghosts In Maze - 1. By Setting This Value
' First And Then Dimming The Arrays, You Don't Have To Change
' The Value Of Every Array If You Decide To Change The Number
' Off Ghosts
' *************************************************************
GHOST_NUMBER=2
Dim GHOST_X(GHOST_NUMBER)
Dim GHOST_Y(GHOST_NUMBER)
Dim GHOST_DIRECTION(GHOST_NUMBER)
Dim GHOST_SPEED(GHOST_NUMBER)
Dim GHOST_FRAME(GHOST_NUMBER)
Dim GHOST_STATE(GHOST_NUMBER)
'
' *************************************************************
' Set Up Ghost Animation Table
' *************************************************************
Dim GHOST_ANIM(27)
Restore GHOST_ANIM_DATA
For K=0 To 26
Read GHOST_ANIM(K)
Next K
'
Dim GHOST_ANIM_START(GHOST_NUMBER)
Dim GHOST_ANIM_POINTER(GHOST_NUMBER)
'
Dim GHOST_COLOUR(GHOST_NUMBER)
Dim GHOST_FLASH(GHOST_NUMBER)
Dim GHOST_EYES_TIMER(GHOST_NUMBER)
Dim GHOST_EYES_FLASH(GHOST_NUMBER)
'
' *************************************************************
' This Array Will Hold Values Corresponding To Directions The
' Ghosts Can Take When It Wants To Make A New Move. The Values
' Will Be Generated Randomly During The Level Set-Up Instead
' Of During The Main Loop
' *************************************************************
Dim GHOST_DIRECTION_LUT(50)
'
' *************************************************************
' Fruit
' *************************************************************
' *************************************************************
' This Array Will Hold The X,Y Co-ords Of The Fruit And Frame
' Value. The Values Are Generated Randomly Before The Main
' Loop Is Started And Can Then Be Looked Up During The Game
' *************************************************************
Dim FRUIT_INFO(30)
'
' *************************************************************
' This Constant Decides How Long It Is Before The Fruit Appears
' In The Maze. The Value Is Decreased By 1 Each Time And When
' This
' *************************************************************
FRUIT_TIMER_START=300
'
' *************************************************************
' This Constant Decides How Long The Effect A Pill Will Have
' *************************************************************
PILL_TIMER_START=200
'
' *************************************************************
' This Constant Decides How Long The Ghost Will Remain As Just
' Eyes
' *************************************************************
GHOST_EYES_TIMER_START=200
'
PACMAN_HISCORE=1000
'
' -------------------------------------------------------------
'
' *************************************************************
' Set Up Display
' *************************************************************
' *************************************************************
' Maze Screen: Uses Double Buffering To Prevent Flickering
' *************************************************************
Screen Open 0,320,208,8,Lowres : Curs Off : Flash Off
Screen Display 0,128,45,,
For K=0 To 31 : Colour K,0 : Next K
Double Buffer
'
' *************************************************************
' Panel Screen: Uses Single Buffer Cos It's Less Hassle
' *************************************************************
Screen Open 1,320,32,8,Lowres : Curs Off : Flash Off
Screen Display 1,128,45+208,,
For K=0 To 31 : Colour K,0 : Next K
Pen 1 : Paper 0
'
Bob Update Off
'
Goto NEW_GAME
'
' -------------------------------------------------------------
'
' *************************************************************
' MAIN LOOP
' *************************************************************
MAIN_LOOP:
Repeat
Wait Vbl
Bob Clear
If GAME_CYCLE=0
Gosub _DO_PACMAN
Gosub _DO_FRUIT
Else
Gosub _DO_GHOSTS
End If
Gosub _DO_PACMAN_ANIM
Gosub _DRAW_ALL
Add GAME_CYCLE,1,0 To 1
Bob Draw
Screen Swap
Until ALL_DONE=5 or PACMAN_STATE=4
'
' **************************************************
' Main Loop Has Been Exited So First Tidy Up Display
' **************************************************
' *************
' Remove Pacman
' *************
Bob Off 1
' *************
' Remove Ghosts
' *************
For K=0 To GHOST_NUMBER : Sprite Off(K*2)+2 : Next K
' ************
' Remove Fruit
' ************
Bob Off 0
' *******************************
' Ensure Anything Eaten By Pacman
' Is Completely Erased From Maze
' *******************************
Autoback 2
If _DOT_GOT>0 Then Cls 0,_DOT_X,_DOT_Y To _DOT_X+15,_DOT_Y+15
_DOT_GOT=0
If PILL_GOT>0 Then Cls 0,PILL_X,PILL_Y To PILL_X+15,PILL_Y+15
PILL_GOT=0
'
' *****************
' Clear Bob Buffers
' *****************
Autoback 0
For K=0 To 1 : Bob Clear : Bob Draw : Screen Swap : Next K
'
Wait 25
'
' ***************
' Level Complete!
' ***************
If ALL_DONE=5
' **********
' Flash Maze
' **********
X=0
For K=0 To 10
If X=0
Colour 2,$22F
Else
Colour 2,$FFF
End If
X=1-X
Wait 15
Next K
' ****************
' Get To Next Maze
' ****************
Add MAZE_NUMBER,1
' *****************
' Is Game Completed
' *****************
If MAZE_NUMBER=NUMBER_OF_MAZES
Wait 25
' *************************************
' Show Patronising Message "WELL DONE!"
' *************************************
Autoback 0
Bob Clear
Bob 0,120,80,87
Bob Draw
Screen Swap
Wait 50
' *******************
' Remove Said Message
' *******************
Bob Off 0
For K=0 To 1 : Bob Clear : Bob Draw : Screen Swap : Next K
Wait 50
' ***********************************************
' Fade Out Maze And Re-Start Game From First Maze
' ***********************************************
Fade 5 : Wait 75
Goto NEW_GAME
End If
' *****************************************************
' If Not Last Level, Fade Out Maze And Go Onto Next One
' *****************************************************
Wait 10
Fade 5 : Wait 75
Goto NEW_LEVEL
End If
'
' *****************
' Pacman Was Killed
' *****************
If PACMAN_STATE=4
Add PACMAN_LIVES,-1
' ************
' Is Game Over
' ************
If PACMAN_LIVES=0
' *****************************
' Remove Last Pacman From Panel
' *****************************
Screen 1
Cls 0,16,8 To 32,24
'
Wait 50
' *************************
' Show Message "GAME OVER!"
' *************************
Screen 0
Autoback 0
Bob Clear
Bob 0,120,80,88
Bob Draw
Screen Swap
Wait 50
' **************
' Remove Message
' **************
Bob Off 0
For K=0 To 1 : Bob Clear : Bob Draw : Screen Swap : Next K
'
Wait 50
'
' ***********************************************
' Fade Out Maze And Re-Start Game From First Maze
' ***********************************************
Fade 5 : Wait 75
Goto NEW_GAME
End If
' ***********************************************
' If Lives Left, Fade Out And Re-Try Current Maze
' ***********************************************
Wait 10
Fade 5 : Wait 75
Goto NEW_LEVEL
End If
'
' -------------------------------------------------------------
'
' *************************************************************
' NEW GAME
' *************************************************************
NEW_GAME:
PACMAN_LIVES=5
PACMAN_SCORE=0
'
MAZE_NUMBER=0
'
Goto NEW_LEVEL
'
' -------------------------------------------------------------
'
' *************************************************************
' NEW LEVEL
' *************************************************************
NEW_LEVEL:
' *************************************************************
' Copy Current Maze Data Into Work Buffer Which We Can Safely
' Overwrite
' *************************************************************
Z=Start(10)+MAZE_NUMBER*260
For K=0 To 259
Poke MAZE_ADDR+K,Peek(Z+K)
Next K
'
' *************
' Set Up Pacman
' *************
PACMAN_X=16 : PACMAN_Y=16
PACMAN_DIRECTION=0 : PACMAN_SPEED=2
PACMAN_ANIM_START=PACMAN_RIGHT_ANIM : PACMAN_ANIM_POINTER=0
PACMAN_FRAME=PACMAN_ANIM(PACMAN_ANIM_START)
PACMAN_STATE=0
'
' *************
' Set Up Ghosts
' *************
Z=MAZE_ADDR
For K=0 To GHOST_NUMBER
Repeat
X=Rnd(19) : Y=Rnd(12)
Until Peek(Z+X+(Y*20))<WALL_START and Abs((X*16)-PACMAN_X)>64 and Abs((Y*16)-PACMAN_Y)>64
GHOST_X(K)=X*16 : GHOST_Y(K)=Y*16
GHOST_DIRECTION(K)=0 : GHOST_SPEED(K)=2
GHOST_STATE(K)=0
GHOST_COLOUR(K)=Rnd(2)
GHOST_ANIM_START(K)=GHOST_COLOUR(K)*5
GHOST_ANIM_POINTER(K)=0
GHOST_FRAME(K)=GHOST_ANIM(GHOST_ANIM_START(K)+GHOST_ANIM_POINTER(K))
GHOST_FLASH(K)=0
GHOST_EYES_TIMER(K)=0
GHOST_EYES_FLASH(K)=0
Next K
'
' **************************
' Set Up Ghost Direction LUT
' **************************
For K=0 To 49
GHOST_DIRECTION_LUT(K)=Rnd(3)+1
Next K
'
GHOST_DIRECTION_LUT(50)=-1
GHOST_DIRECTION_POINTER=0
'
' ************
' Set Up Fruit
' ************
FRUIT_STATE=0
FRUIT_TIMER=FRUIT_TIMER_START
'
' ***********************
' Fruit Information Table
' ***********************
Z=MAZE_ADDR
For K=0 To 9
Repeat
X=Rnd(19) : Y=Rnd(12)
Until Peek(Z+X+(Y*20))<WALL_START
FRUIT_INFO(K*3)=X*16 : FRUIT_INFO((K*3)+1)=Y*16 : FRUIT_INFO((K*3)+2)=43+Rnd(3)
Next K
'
FRUIT_INFO(30)=-1
FRUIT_INFO_POINTER=0
'
' *********************
' Reset This Little Lot
' *********************
_DOT_TO_COLLECT=0
_DOT_GOT=0
PILL_GOT=0
PILL_TIMER=0
ALL_DONE=0
'
' *******************
' Set Up Status Panel
' *******************
Screen 1
Cls 0
Gosub _SHOW_LIVES
Locate 19+6,1 : Print "SCORE:"
Locate 17+6,2 : Print "HISCORE:"
Gosub _SHOW_SCORE
'
' *************
' Fade In Panel
' *************
Fade 5 To -1 : Wait 75
'
' *******************
' Set Up Maze Display
' *******************
Screen 0
'
' *********
' Draw Maze
' *********
' *************************************
' Draw To Both Screens Of Double Buffer
' *************************************
Autoback 1
'
Cls 0
'
' *********************************
' Find Start Of This Mazes Map Data
' *********************************
MAZE_POINTER=MAZE_ADDR
'
' **********************
' Draw In Each Map Block
' **********************
For Y=0 To 12
For X=0 To 19
'
BLOCK_NUMBER=Peek(MAZE_POINTER)
If BLOCK_NUMBER>0 Then Paste Bob X*16,Y*16,BLOCK_NUMBER
'
' ************************************************************
' Look For Dots. If One Found, Increase The Amount To Collect
' Variable
' ************************************************************
If Peek(MAZE_POINTER)>=_DOT_START and Peek(MAZE_POINTER)<=_DOT_END
Add _DOT_TO_COLLECT,1
End If
Add MAZE_POINTER,1
Next X
Next Y
'
' ************
' Fade In Maze
' ************
Fade 5 To -1 : Wait 75
'
' *************************************************************
' Change Drawing Mode So Output Is Only Done To The Logical
' Screen
' *************************************************************
Autoback 0
'
' ***********************************
' Show Message "Press Fire To Start!"
' ***********************************
Bob Clear
Bob 0,120,80,85
Bob 1,120,96,86
Bob Draw
Screen Swap
'
Repeat : Until Fire(1)
'
' **************
' Remove Message
' **************
Bob Off 0 : Bob Off 1
For K=0 To 1 : Bob Clear : Bob Draw : Screen Swap : Next K
'
Wait 30
'
' **********************
' Show Pacman And Ghosts
' **********************
Bob Clear
Gosub _DRAW_ALL
Bob Draw
Screen Swap
'
Wait 30
'
Goto MAIN_LOOP
'
' -------------------------------------------------------------
'
' *************************************************************
' DO PACMAN
' *************************************************************
_DO_PACMAN:
If PACMAN_STATE=0
PACMAN_DIRECTION_CHANGED=0
' *************
' Try And Go Up
' *************
If(Joy(1)=1 or Joy(1)=9 or Joy(1)=5) and PACMAN_DIRECTION<>1
X0=PACMAN_X/16
X1=(PACMAN_X+15)/16
Y0=(PACMAN_Y-PACMAN_SPEED)/16
Z=MAZE_ADDR
If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X1+(Y0*20))<WALL_START
PACMAN_DIRECTION=1
PACMAN_ANIM_START=PACMAN_UP_ANIM : PACMAN_ANIM_POINTER=0
PACMAN_DIRECTION_CHANGED=1
End If
End If
'
' ****************
' Try And Go Right
' ****************
If(Joy(1)=8 or Joy(1)=9 or Joy(1)=10) and PACMAN_DIRECTION<>2 and PACMAN_DIRECTION_CHANGED=0
X0=(PACMAN_X+15+PACMAN_SPEED)/16
Y0=PACMAN_Y/16
Y1=(PACMAN_Y+15)/16
Z=MAZE_ADDR
If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X0+(Y1*20))<WALL_START
PACMAN_DIRECTION=2
PACMAN_ANIM_START=PACMAN_RIGHT_ANIM : PACMAN_ANIM_POINTER=0
PACMAN_DIRECTION_CHANGED=1
End If
End If
'
' ***************
' Try And Go Down
' ***************
If(Joy(1)=2 or Joy(1)=10 or Joy(1)=6) and PACMAN_DIRECTION<>3 and PACMAN_DIRECTION_CHANGED=0
X0=PACMAN_X/16
X1=(PACMAN_X+15)/16
Y0=(PACMAN_Y+15+PACMAN_SPEED)/16
Z=MAZE_ADDR
If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X1+(Y0*20))<WALL_START
PACMAN_DIRECTION=3
PACMAN_ANIM_START=PACMAN_DOWN_ANIM : PACMAN_ANIM_POINTER=0
PACMAN_DIRECTION_CHANGED=1
End If
End If
'
' ***************
' Try And Go Left
' ***************
If(Joy(1)=4 or Joy(1)=6 or Joy(1)=5) and PACMAN_DIRECTION<>4 and PACMAN_DIRECTION_CHANGED=0
X0=(PACMAN_X-PACMAN_SPEED)/16
Y0=PACMAN_Y/16
Y1=(PACMAN_Y+15)/16
Z=MAZE_ADDR
If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X0+(Y1*20))<WALL_START
PACMAN_DIRECTION=4
PACMAN_ANIM_START=PACMAN_LEFT_ANIM : PACMAN_ANIM_POINTER=0
PACMAN_DIRECTION_CHANGED=1
End If
End If
'
' *******
' Move Up
' *******
If PACMAN_DIRECTION=1
X0=PACMAN_X/16
X1=(PACMAN_X+15)/16
Y0=(PACMAN_Y-PACMAN_SPEED)/16
Z=MAZE_ADDR
If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X1+(Y0*20))<WALL_START
Add PACMAN_Y,-PACMAN_SPEED
End If
End If
'
' **********
' Move Right
' **********
If PACMAN_DIRECTION=2
X0=(PACMAN_X+15+PACMAN_SPEED)/16
Y0=PACMAN_Y/16
Y1=(PACMAN_Y+15)/16
Z=MAZE_ADDR
If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X0+(Y1*20))<WALL_START
Add PACMAN_X,PACMAN_SPEED
End If
End If
'
' *********
' Move Down
' *********
If PACMAN_DIRECTION=3
X0=PACMAN_X/16
X1=(PACMAN_X+15)/16
Y0=(PACMAN_Y+15+PACMAN_SPEED)/16
Z=MAZE_ADDR
If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X1+(Y0*20))<WALL_START
Add PACMAN_Y,PACMAN_SPEED
End If
End If
'
' *********
' Move Left
' *********
If PACMAN_DIRECTION=4
X0=(PACMAN_X-PACMAN_SPEED)/16
Y0=PACMAN_Y/16
Y1=(PACMAN_Y+15)/16
Z=MAZE_ADDR
If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X0+(Y1*20))<WALL_START
Add PACMAN_X,-PACMAN_SPEED
End If
End If
'
' **********************
' Has Pacman Eaten A Dot
' **********************
X0=(PACMAN_X+7)/16
Y0=(PACMAN_Y+7)/16
Z=MAZE_ADDR
BLOCK_ADDR=Z+X0+(Y0*20)
BLOCK_NUMBER=Peek(BLOCK_ADDR)
If BLOCK_NUMBER>=_DOT_START and BLOCK_NUMBER<=_DOT_END
_DOT_X=X0*16 : _DOT_Y=Y0*16 : _DOT_GOT=2
Poke BLOCK_ADDR,0
Add _DOT_TO_COLLECT,-1
Add PACMAN_SCORE,10 : Gosub _SHOW_SCORE
End If
'
If _DOT_TO_COLLECT=0
Add ALL_DONE,1
End If
'
' ***********************
' Has Pacman Eaten A Pill
' ***********************
X0=(PACMAN_X+7)/16
Y0=(PACMAN_Y+7)/16
Z=MAZE_ADDR
BLOCK_ADDR=Z+X0+(Y0*20)
BLOCK_NUMBER=Peek(BLOCK_ADDR)
If BLOCK_NUMBER>=PILL_START and BLOCK_NUMBER<=PILL_END
PILL_X=X0*16 : PILL_Y=Y0*16 : PILL_GOT=2
Poke BLOCK_ADDR,0
PILL_TIMER=PILL_TIMER_START
Sprite 0,PILL_X+128,PILL_Y+45,82
Wait 25
Add PACMAN_SCORE,100 : Gosub _SHOW_SCORE
Sprite Off 0
' *********************
' change ghosts to blue
' *********************
For K=0 To GHOST_NUMBER
If GHOST_EYES_TIMER(K)=0
GHOST_ANIM_START(K)=15
GHOST_FLASH(K)=0
End If
Next K
End If
'
' **************************************
' Reduce Pill Timer And When Zero Ghosts
' Revert Back 2 Normal
' **************************************
If PILL_TIMER>0
Add PILL_TIMER,-1
' ***************************
' Flash Ghosts To Warn Player
' That Pill Is Wearing Out
' ***************************
If PILL_TIMER=PILL_TIMER_START/2
For K=0 To GHOST_NUMBER
If GHOST_EYES_TIMER(K)=0
GHOST_FLASH(K)=1
End If
Next K
End If
' *********************
' Pill Run Out So Put
' Ghosts Back To Normal
' *********************
If PILL_TIMER=0
For K=0 To GHOST_NUMBER
If GHOST_EYES_TIMER(K)=0
GHOST_ANIM_START(K)=GHOST_COLOUR(K)*5
GHOST_FLASH(K)=0
End If
Next K
End If
End If
'
' ********************************
' Has Pacman Collided With A Ghost
' ********************************
X0=PACMAN_X+2 : X1=PACMAN_X+13 : Y0=PACMAN_Y+2 : Y1=PACMAN_Y+13
PACMAN_BAD_COLLIDE=0
For K=0 To GHOST_NUMBER
X2=GHOST_X(K) : X3=GHOST_X(K)+15 : Y2=GHOST_Y(K) : Y3=GHOST_Y(K)+15
If((X0>=X2 and X0<=X3) or(X1>=X2 and X1<=X3)) and((Y0>=Y2 and Y0<=Y3) or(Y1>=Y2 and Y1<=Y3))
If GHOST_EYES_TIMER(K)=0
' *************************
' Bad Collide = Pacman Dies
' *************************
If PILL_TIMER=0
PACMAN_BAD_COLLIDE=1
End If
' **************************
' Good Collide = Ghost Eaten
' **************************
If PILL_TIMER>0
GHOST_ANIM_START(K)=20
GHOST_FLASH(K)=0
GHOST_EYES_TIMER(K)=GHOST_EYES_TIMER_START
Sprite 0,GHOST_X(K)+128,GHOST_Y(K)+45,83
Wait 25
Add PACMAN_SCORE,200 : Gosub _SHOW_SCORE
Sprite Off 0
End If
End If
End If
Next K
'
' *******************************
' If Bad Collision True Set Up
' Pacman To Die And Remove Ghosts
' *******************************
If PACMAN_BAD_COLLIDE=1
PACMAN_STATE=1
PACMAN_TIMER=25
PACMAN_ANIM_START=PACMAN_DYING_ANIM
PACMAN_ANIM_POINTER=0
'
For K=0 To GHOST_NUMBER
GHOST_STATE(K)=3
GHOST_FLASH=0
GHOST_EYES_TIMER=-1
Next K
'
FRUIT_TIMER=-1
PACMAN_BAD_COLLIDE=0
End If
End If
'
' ********************
' Pause B4 Pacman Dies
' ********************
If PACMAN_STATE=1
Add PACMAN_TIMER,-1
If PACMAN_TIMER=0
PACMAN_STATE=2
' *************
' Remove Ghosts
' *************
For K=0 To GHOST_NUMBER
GHOST_STATE(K)=-1
GHOST_ANIM_START(K)=25
GHOST_ANIM_POINTER(K)=0
Next K
End If
End If
'
' ***************
' Pacman Is Dying
' ***************
If PACMAN_STATE=2
If PACMAN_ANIM_DELAY=0
PACMAN_FRAME=PACMAN_ANIM(PACMAN_ANIM_START+PACMAN_ANIM_POINTER)
If PACMAN_FRAME=-1
PACMAN_FRAME=81
PACMAN_STATE=3
PACMAN_TIMER=10
End If
'
Add PACMAN_ANIM_POINTER,1
End If
'
Add PACMAN_ANIM_DELAY,1,0 To 1
End If
'
' ************************
' Wait B4 Restarting Level
' ************************
If PACMAN_STATE=3
Add PACMAN_TIMER,-1
If PACMAN_TIMER=0
PACMAN_STATE=4
End If
End If
Return
'
' -------------------------------------------------------------
'
' *************************************************************
' DO PACMAN ANIM
' *************************************************************
_DO_PACMAN_ANIM:
If PACMAN_STATE=0
Repeat
PACMAN_FRAME=PACMAN_ANIM(PACMAN_ANIM_START+PACMAN_ANIM_POINTER)
If PACMAN_FRAME=-1
PACMAN_ANIM_POINTER=0
End If
Until PACMAN_FRAME<>-1
'
Add PACMAN_ANIM_POINTER,1
End If
Return
'
' -------------------------------------------------------------
'
' *************************************************************
' DO GHOSTS
' *************************************************************
_DO_GHOSTS:
GHOST_NEW_MOVE=0
GHOST_NEW_MOVE_ATTEMPT=0
For K=0 To GHOST_NUMBER
If GHOST_STATE(K)=0 and GHOST_NEW_MOVE=0
' *******************************************************
' Get Opposite To Last Direction So We Don't Double Back
' On Ourselves
' *******************************************************
GHOST_OPPOSITE_DIRECTION=GHOST_DIRECTION(K)
For K0=0 To 1
Add GHOST_OPPOSITE_DIRECTION,1
If GHOST_OPPOSITE_DIRECTION>4
GHOST_OPPOSITE_DIRECTION=1
End If
Next K0
' ********************
' Get Random Direction
' ********************
Repeat
Repeat
GHOST_POSSIBLE_DIRECTION=GHOST_DIRECTION_LUT(GHOST_DIRECTION_POINTER)
If GHOST_POSSIBLE_DIRECTION=-1
GHOST_DIRECTION_POINTER=0
End If
Until GHOST_POSSIBLE_DIRECTION<>-1
'
Add GHOST_DIRECTION_POINTER,1
' **************
' Is It Possible
' **************
If GHOST_POSSIBLE_DIRECTION<>GHOST_OPPOSITE_DIRECTION or GHOST_NEW_MOVE_ATTEMPT>4
' **
' Up
' **
If GHOST_POSSIBLE_DIRECTION=1
X0=GHOST_X(K)/16
X1=(GHOST_X(K)+15)/16
Y0=(GHOST_Y(K)-GHOST_SPEED(K))/16
Z=MAZE_ADDR
If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X1+(Y0*20))<WALL_START
GHOST_DIRECTION(K)=1 : GHOST_STATE(K)=2
End If
End If
' *****
' Right
' *****
If GHOST_POSSIBLE_DIRECTION=2
X0=(GHOST_X(K)+15+GHOST_SPEED(K))/16
Y0=GHOST_Y(K)/16
Y1=(GHOST_Y(K)+15)/16
Z=MAZE_ADDR
If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X0+(Y1*20))<WALL_START
GHOST_DIRECTION(K)=2 : GHOST_STATE(K)=2
End If
End If
' ****
' Down
' ****
If GHOST_POSSIBLE_DIRECTION=3
X0=GHOST_X(K)/16
X1=(GHOST_X(K)+15)/16
Y0=(GHOST_Y(K)+15+GHOST_SPEED(K))/16
Z=MAZE_ADDR
If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X1+(Y0*20))<WALL_START
GHOST_DIRECTION(K)=3 : GHOST_STATE(K)=2
End If
End If
' ****
' Left
' ****
If GHOST_POSSIBLE_DIRECTION=4
X0=(GHOST_X(K)-GHOST_SPEED(K))/16
Y0=GHOST_Y(K)/16
Y1=(GHOST_Y(K)+15)/16
Z=MAZE_ADDR
If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X0+(Y1*20))<WALL_START
GHOST_DIRECTION(K)=4 : GHOST_STATE(K)=2
End If
End If
End If
'
Add GHOST_NEW_MOVE_ATTEMPT,1
Until GHOST_STATE(K)=2
GHOST_NEW_MOVE=1
End If
'
' ***********
' Move Ghosts
' ***********
If GHOST_STATE(K)=1
' **
' Up
' **
If GHOST_DIRECTION(K)=1
X0=GHOST_X(K)/16
X1=(GHOST_X(K)+15)/16
Y0=(GHOST_Y(K)-GHOST_SPEED(K))/16
Z=MAZE_ADDR
If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X1+(Y0*20))<WALL_START
Add GHOST_Y(K),-GHOST_SPEED(K)
Else
GHOST_STATE(K)=0
End If
' ***************
' Can We Go Right
' ***************
X0=(GHOST_X(K)+15+GHOST_SPEED(K))/16
Y0=GHOST_Y(K)/16
Y1=(GHOST_Y(K)+15)/16
Z=MAZE_ADDR
If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X0+(Y1*20))<WALL_START
GHOST_STATE(K)=0
End If
' **************
' Can We Go Left
' **************
X0=(GHOST_X(K)-GHOST_SPEED(K))/16
Y0=GHOST_Y(K)/16
Y1=(GHOST_Y(K)+15)/16
Z=MAZE_ADDR
If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X0+(Y1*20))<WALL_START
GHOST_STATE(K)=0
End If
End If
' *****
' Right
' *****
If GHOST_DIRECTION(K)=2
X0=(GHOST_X(K)+15+GHOST_SPEED(K))/16
Y0=GHOST_Y(K)/16
Y1=(GHOST_Y(K)+15)/16
Z=MAZE_ADDR
If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X0+(Y1*20))<WALL_START
Add GHOST_X(K),GHOST_SPEED(K)
Else
GHOST_STATE(K)=0
End If
' ************
' Can We Go Up
' ************
X0=GHOST_X(K)/16
X1=(GHOST_X(K)+15)/16
Y0=(GHOST_Y(K)-GHOST_SPEED(K))/16
Z=MAZE_ADDR
If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X1+(Y0*20))<WALL_START
GHOST_STATE(K)=0
End If
' **************
' Can We Go Down
' **************
X0=GHOST_X(K)/16
X1=(GHOST_X(K)+15)/16
Y0=(GHOST_Y(K)+15+GHOST_SPEED(K))/16
Z=MAZE_ADDR
If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X1+(Y0*20))<WALL_START
GHOST_STATE(K)=0
End If
End If
' ****
' Down
' ****
If GHOST_DIRECTION(K)=3
X0=GHOST_X(K)/16
X1=(GHOST_X(K)+15)/16
Y0=(GHOST_Y(K)+15+GHOST_SPEED(K))/16
Z=MAZE_ADDR
If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X1+(Y0*20))<WALL_START
Add GHOST_Y(K),GHOST_SPEED(K)
Else
GHOST_STATE(K)=0
End If
' ***************
' Can We Go Right
' ***************
X0=(GHOST_X(K)+15+GHOST_SPEED(K))/16
Y0=GHOST_Y(K)/16
Y1=(GHOST_Y(K)+15)/16
Z=MAZE_ADDR
If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X0+(Y1*20))<WALL_START
GHOST_STATE(K)=0
End If
' **************
' Can We Go Left
' **************
X0=(GHOST_X(K)-GHOST_SPEED(K))/16
Y0=GHOST_Y(K)/16
Y1=(GHOST_Y(K)+15)/16
Z=MAZE_ADDR
If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X0+(Y1*20))<WALL_START
GHOST_STATE(K)=0
End If
End If
' ****
' Left
' ****
If GHOST_DIRECTION(K)=4
X0=(GHOST_X(K)-GHOST_SPEED(K))/16
Y0=GHOST_Y(K)/16
Y1=(GHOST_Y(K)+15)/16
Z=MAZE_ADDR
If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X0+(Y1*20))<WALL_START
Add GHOST_X(K),-GHOST_SPEED(K)
Else
GHOST_STATE(K)=0
End If
' ************
' Can We Go Up
' ************
X0=GHOST_X(K)/16
X1=(GHOST_X(K)+15)/16
Y0=(GHOST_Y(K)-GHOST_SPEED(K))/16
Z=MAZE_ADDR
If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X1+(Y0*20))<WALL_START
GHOST_STATE(K)=0
End If
' **************
' Can We Go Down
' **************
X0=GHOST_X(K)/16
X1=(GHOST_X(K)+15)/16
Y0=(GHOST_Y(K)+15+GHOST_SPEED(K))/16
Z=MAZE_ADDR
If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X1+(Y0*20))<WALL_START
GHOST_STATE(K)=0
End If
End If
'
End If
'
' **********************************************************
' This Stops A Ghost Getting A New Direction AND Being Moved
' In The Same Frame
' **********************************************************
If GHOST_STATE(K)=2
GHOST_STATE(K)=1
End If
'
' ************************************
' This Deals With The Ghost Eyes Timer
' ************************************
If GHOST_EYES_TIMER(K)>0
Add GHOST_EYES_TIMER(K),-1
If GHOST_EYES_TIMER(K)=GHOST_EYES_TIMER_START/2
GHOST_EYES_FLASH(K)=1
End If
If GHOST_EYES_TIMER(K)=0
GHOST_ANIM_START(K)=GHOST_COLOUR(K)*5
If PILL_TIMER>0
GHOST_ANIM_START(K)=15
End If
If PILL_TIMER>0 and PILL_TIMER<PILL_TIMER_START/2
GHOST_FLASH(K)=1
End If
GHOST_EYES_FLASH(K)=0
End If
End If
'
' ***************
' Ghost Animation
' ***************
If GHOST_ANIM_DELAY=0
' ************************
' Flash Normal Colour/Blue
' ************************
If GHOST_FLASH(K)=1
If GHOST_ANIM_START(K)=15
GHOST_ANIM_START(K)=GHOST_COLOUR(K)*5
Else
GHOST_ANIM_START(K)=15
End If
End If
' ************************
' Flash Normal Colour/Eyes
' ************************
If GHOST_EYES_FLASH(K)=1
If GHOST_ANIM_START(K)=20
If PILL_TIMER>0
GHOST_ANIM_START(K)=15
Else
GHOST_ANIM_START(K)=GHOST_COLOUR(K)*5
End If
Else
GHOST_ANIM_START(K)=20
End If
End If
Repeat
GHOST_FRAME(K)=GHOST_ANIM(GHOST_ANIM_START(K)+GHOST_ANIM_POINTER(K))
If GHOST_FRAME(K)=-1
GHOST_ANIM_POINTER(K)=0
End If
Until GHOST_FRAME(K)<>-1
'
Add GHOST_ANIM_POINTER(K),1
End If
Next K
'
Return
'
' -------------------------------------------------------------
'
' *************************************************************
' DRAW ALL
' *************************************************************
_DRAW_ALL:
Screen 0
'
' *************
' Blank Out Dot
' *************
If _DOT_GOT>0
Cls 0,_DOT_X,_DOT_Y To _DOT_X+16,_DOT_Y+16
Add _DOT_GOT,-1
End If
'
' **************
' Blank Out Pill
' **************
If PILL_GOT>0
Cls 0,PILL_X,PILL_Y To PILL_X+16,PILL_Y+16
Add PILL_GOT,-1
End If
'
' ******
' Ghosts
' ******
X=2
For K=0 To GHOST_NUMBER
Sprite X,GHOST_X(K)+128,GHOST_Y(K)+45,GHOST_FRAME(K)
Add X,2
Next K
'
' *****
' Fruit
' *****
If FRUIT_STATE=1 Then Bob 0,FRUIT_X,FRUIT_Y,FRUIT_FRAME
'
' ******
' Pacman
' ******
Bob 1,PACMAN_X,PACMAN_Y,PACMAN_FRAME
Return
'
' -------------------------------------------------------------
'
' *************************************************************
' DO FRUIT
' *************************************************************
_DO_FRUIT:
' ********************
' Decrease Fruit Timer
' ********************
Add FRUIT_TIMER,-1
'
' ***********************************************************
' When Timer Reaches Half-Way, Get Co-Ords And Frame And Show
' ***********************************************************
If FRUIT_TIMER=FRUIT_TIMER_START/2
Repeat
FRUIT_X=FRUIT_INFO(FRUIT_INFO_POINTER)
If FRUIT_X=-1
FRUIT_INFO_POINTER=0
End If
Until FRUIT_X<>-1
'
FRUIT_Y=FRUIT_INFO(FRUIT_INFO_POINTER+1)
FRUIT_FRAME=FRUIT_INFO(FRUIT_INFO_POINTER+2)
'
Add FRUIT_INFO_POINTER,3
'
FRUIT_STATE=1
End If
'
' *******************************
' If Timer Runs Out, Remove Fruit
' *******************************
If FRUIT_TIMER=0
Bob Off 0
FRUIT_STATE=0 : FRUIT_TIMER=FRUIT_TIMER_START
End If
'
' ******************************
' Has Pacman Collided With Fruit
' ******************************
If FRUIT_STATE=1
X0=PACMAN_X+3 : X1=PACMAN_X+12 : Y0=PACMAN_Y+3 : Y1=PACMAN_Y+12
X2=FRUIT_X : X3=FRUIT_X+15 : Y2=FRUIT_Y : Y3=FRUIT_Y+15
' ***********************************
' Yes, So Remove Fruit, Add Score Etc
' ***********************************
If((X0>=X2 and X0<=X3) or(X1>=X2 and X1<=X3)) and((Y0>=Y2 and Y0<=Y3) or(Y1>=Y2 and Y1<=Y3))
Bob Off 0
FRUIT_STATE=0 : FRUIT_TIMER=FRUIT_TIMER_START
Sprite 0,FRUIT_X+128,FRUIT_Y+45,82
Wait 25
Add PACMAN_SCORE,100 : Gosub _SHOW_SCORE
Sprite Off 0
End If
End If
Return
'
' -------------------------------------------------------------
'
' *************************************************************
' SHOW LIVES
' *************************************************************
_SHOW_LIVES:
Screen 1
For K=1 To PACMAN_LIVES
Paste Bob K*16,8,PACMAN_ANIM(11)
Next K
Return
'
' -------------------------------------------------------------
'
' *************************************************************
' SHOW SCORE
' *************************************************************
_SHOW_SCORE:
Screen 1
Locate 25+6,1
Print " "
Locate 25+6,1
Print PACMAN_SCORE
'
' ***************************
' Does Hi-Score Need Updating
' ***************************
If PACMAN_SCORE>PACMAN_HISCORE
PACMAN_HISCORE=PACMAN_SCORE
End If
'
Locate 25+6,2
Print " "
Locate 25+6,2
Print PACMAN_HISCORE
Return
'
' -------------------------------------------------------------
'
' *************************************************************
' PACMAN ANIMATION DATA
' *************************************************************
' **
' Up
' **
PACMAN_ANIM_DATA:
Data 47,48,49,50,51,52,51,50,49,48,-1
' *****
' Right
' *****
Data 53,54,55,56,57,58,57,56,55,54,-1
' ****
' Down
' ****
Data 59,60,61,62,63,64,63,62,61,60,-1
' ****
' Left
' ****
Data 65,66,67,68,69,70,69,68,67,66,-1
'
' *****
' Dying
' *****
Data 71,72,73,74,75,76,77,78,79,80,81,-1
'
' -------------------------------------------------------------
'
' *************************************************************
' GHOST ANIMATION DATA
' *************************************************************
' *********
' Ghost:Red
' *********
GHOST_ANIM_DATA:
Data 89,90,91,92,-1
'
' ************
' Ghost:Yellow
' ************
Data 93,94,95,96,-1
'
' ***********
' Ghost:Green
' ***********
Data 97,98,99,100,-1
'
' **********
' Ghost:Blue
' **********
Data 101,102,103,104,-1
'
' **********
' Ghost:Eyes
' **********
Data 105,106,107,108,-1
'
' ***********
' Ghost:Blank
' ***********
Data 109,-1
'
' -------------------------------------------------------------
'
' And That's Yer Lot!
'